#ifndef __ADAFRUIT_ST7789_H
#define __ADAFRUIT_ST7789_H

#include "stm32f4xx_hal.h"
#include <stdbool.h>

#define ST7789_ROTATION_0 (0)
#define ST7789_ROTATION_90 (1)
#define ST7789_ROTATION_180 (2)
#define ST7789_ROTATION_270 (3)

#define ST7789_TFTWIDTH (135)
#define ST7789_TFTHEIGHT (240)

#define ST7789_PORT_CS_SELECT() LL_GPIO_ResetOutputPin(TFT_CS_GPIO_Port, TFT_CS_Pin)
#define ST7789_PORT_CS_DISELECT() LL_GPIO_SetOutputPin(TFT_CS_GPIO_Port, TFT_CS_Pin)
#define ST7789_CMD(opt)                                           \
    do                                                            \
    {                                                             \
        if (opt)                                                  \
            LL_GPIO_ResetOutputPin(TFT_DC_GPIO_Port, TFT_DC_Pin); \
        else                                                      \
            LL_GPIO_SetOutputPin(TFT_DC_GPIO_Port, TFT_DC_Pin);   \
    } while (0)

#define ST7789_DATA(opt) ST7789_CMD(!opt)

#define ST7789_RST_CLR() LL_GPIO_ResetOutputPin(TFT_CSK_GPIO_Port, TFT_CSK_Pin)
#define ST7789_RST_SET() LL_GPIO_SetOutputPin(TFT_CSK_GPIO_Port, TFT_CSK_Pin)
#define ST7789_DELAY HAL_Delay

bool st7789_init(void);
void st7789_drwa_window(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t *color);
void st7789_drwa_window_cplt_register_cb(void (*fun)(void));
void st7789_rotation(uint8_t r);
void st7789_fillScreen(uint16_t color);

uint16_t st7789_get_width(void);
uint16_t st7789_get_height(void);

void st7789_set_blk(uint16_t val);

#endif
